package _9_日期与时间;

import org.junit.jupiter.api.Test;

import java.time.*;

/**
 * 时间戳
 * https://www.liaoxuefeng.com/wiki/1252599548343744/1303905346519074
 */
public class _5_InstantTest {

    /**
     * 时间戳在java.time中以Instant类型表示，我们用Instant.now()获取当前时间戳，
     * 效果和System.currentTimeMillis()类似
     */
    @Test
    public void instantTest(){
        Instant instant = Instant.now();
        System.out.println("java.time：秒：" + instant.getEpochSecond());//秒
        System.out.println("java.time：毫秒：" + instant.toEpochMilli());//毫秒

        System.out.println("java.lang：毫秒：" + System.currentTimeMillis());//毫秒
    }

    /**
     *
     * LocalDateTime，ZoneId，Instant，ZonedDateTime和long都可以互相转换
     *
     * ┌─────────────┐
     * │LocalDateTime│────┐
     * └─────────────┘    │    ┌─────────────┐
     *                    ├───>│ZonedDateTime│
     * ┌─────────────┐    │    └─────────────┘
     * │   ZoneId    │────┘           ▲
     * └─────────────┘      ┌─────────┴─────────┐
     *                      │                   │
     *                      ▼                   ▼
     *               ┌─────────────┐     ┌─────────────┐
     *               │   Instant   │<───>│    long     │
     *               └─────────────┘     └─────────────┘
     */


    /**
     * 时间戳 转为 ZonedDateTime（时间戳：timestamp 或 Instant）
     */
    @Test
    public void instantToZonedDateTimeTest(){
        Instant instant = Instant.now();
        ZoneId zoneId = ZoneId.systemDefault();
        ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(instant,zoneId);
        System.out.println(zonedDateTime);
    }

    @Test
    public void instantToZonedDateTimeTest2(){
        Instant instant1 = Instant.ofEpochSecond(1591337691);
        ZoneId zoneId = ZoneId.systemDefault();
        ZonedDateTime zonedDateTime = instant1.atZone(zoneId);
        ZonedDateTime zonedDateTime1 = ZonedDateTime.ofInstant(instant1,zoneId);
        System.out.println(zonedDateTime);
        System.out.println(zonedDateTime1);
    }

    /**
     * 时间戳(秒) 转为 LocalDateTime（时间戳：timestamp 或 Instant）
     */
    @Test
    public void instantToLocalDateTimeTest(){
        Instant instant = Instant.ofEpochSecond(1591337691);
        ZoneId zoneId = ZoneId.systemDefault();
        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant,zoneId);
        System.out.println(localDateTime);
    }

    /**
     * 时间戳(毫秒) 转为 LocalDateTime（时间戳：timestamp 或 Instant）
     */
    @Test
    public void instantToLocalDateTimeTest2(){
        LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(1591345347000L), ZoneId.systemDefault());
        LocalDateTime localDateTime1 = LocalDateTime.ofInstant(Instant.now(), ZoneId.systemDefault());
        System.out.println(localDateTime);
        System.out.println(localDateTime1);
    }

    /**
     * LocalDateTime转为long类型的timestamp
     */
    @Test
    public void localDateTimeToInstantTest(){
        ZoneId zoneId = ZoneId.systemDefault();
        LocalDateTime localDateTime = LocalDateTime.now();

        Instant instant = localDateTime.atZone(zoneId).toInstant();
        System.out.println(instant.toEpochMilli());

        Instant instant1 = localDateTime.toInstant(ZoneOffset.ofHours(8));
        System.out.println(instant1.toEpochMilli());
    }

}
